嗨~大家好啊,不知不覺已經到第七天了,今天又是新的開始,說道今天的主題前,先想看看昨天我們在介紹LINQ
時,是不是會使用到Where
、Select
、Join
等等相關得方法,但你會不會好奇裡面的寫法怎會出現像u => u.name
、(x, y) => x + y
這類寫法,這寫法就對應到了今天的主題lambda
,除了C#
以外還有很多語言都會用到lambda,但是在不同程式語言上都有不太一樣的解釋,這裡的話我就以C#的lambda來做介紹
說到lambda,你一定要對這符號不陌生=>
,所有的規則都一定會造著這個符號走,有了規則後,下一步我們要知道在符號的兩邊要放甚麼東西,正常的情況下左邊的部分會放我們要輸入的參數,參數的部分也不是像放甚麼就放,右邊的話就釋放你要你要做的事,這裡主要分為兩大類運算式lambda
和陳述式lambda
,這兩種應該從字面上就很好懂
lambda 的概念可以寫成 輸入 => 黑箱 => 輸出
name = (a, b) => a + b
以上面這個例子來說,其實name
取甚麼並不是那麼重要,這也就是匿名方式
的概念
再來(a, b)
是我們要輸入的參數,這裡的參數不用特別給型別也能使用
最後的地方就是要處理的動作,像上面a + b
就是對這兩個數值做相加
在我們沒用 lambda
前寫的方式又長又臭
static int Test(int x, int y)
{
return x + y;
}
Func<int, int , int> test = Test;
int z = test(100, 50);
Console.WriteLine(z);
使用 lambda
後,變得簡單乾淨,也很好去做更動
Func<double , double , double> test = (x, y) => x * y;
double z = test(100, 50);
Console.WriteLine(z);
剛才我們有說 lambda
可以分成運算式
和陳述式
兩種方式,下面也是用簡單的方式看看他們不同的地方
沒參數的運算式
Action act () => Console.WriteLine("this is no parameters");
act();
有參數的運算式
Action<string ,int > act = (name, age) => Console.WriteLine($"{name}今年{age}歲");
act("王8", 18);
沒參數的陳述式
Action act () => Console.WriteLine("this is no parameters");
act();
有參數的陳述式
Func<double, double, string> func = (height, weight) => {
double bmi = weight / (height * height);
switch (bmi)
{
case <18.5:
{
return "你是猴子嗎,還不吃多一點";
}
case >24:
{
return "你都胖成這樣還不趕快把手上的洋芋片給我";
}
default:
{
return "很好,你跟正常人一樣普通";
}
}
};
Console.WriteLine(func(1.75, 80));
做完這種練習後我心想,有差嗎?除了多了括號我看不出不同點,但是看了官網說:運算式 lambda 的主體可以包含方法呼叫
、陳述式 lambda 的主體可以包含任意數目的陳述式
,說實話看完我還是不懂,這可能要在我之後有遇到問題才能確切的體會
說到這裡最都口渴了,感覺差不多了,但是最後我還要說一下,lambda
除了使用在委派型別的狀況以外,另一種常見的地方就是昨天說的LINQ
,這也是我今天為甚麼要做這個題目的原因,由於在之後會很常用到LINQ
和lambda
所以希望這兩個東西能了解在幹嘛的
最後今天也真的到尾聲了,如果大家有想瞭解更深的話大家可以到官網去了解喔,那我們就明天見了~~~
參考資料:
https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/operators/lambda-expressions
https://www.youtube.com/watch?v=eq_LrLDUL8A&list=PLJgD_fXVXZKpcoQ297GBMvw_AC3AvnoDz&index=22
https://www.gss.com.tw/blog/c-lambda%E4%BB%8B%E7%B4%B9
https://ithelp.ithome.com.tw/articles/10100451
https://medium.com/@newpage0720/%E5%B0%8Dc-%E7%9A%84-lambda-%E7%9A%84%E7%90%86%E8%A7%A3-438e6de01305